package com.evosoft.facade;

import com.evosoft.excepciones.CantCreateUpdate;
import com.evosoft.excepciones.NotEntityFoundException;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.evosoft.model.Empresa;
import com.evosoft.service.ServiceFactory;
import java.util.ArrayList;
import java.util.List;

public class EmpresaFacade {
	
	
	private static EmpresaFacade instance;

    private EmpresaFacade() {
    }

    public synchronized static EmpresaFacade getInstance() {
        if (instance == null) {
            instance = new EmpresaFacade();
        }

        return instance;
    }
    
    
    /*Metodo de fachada que sirve para crear una empresa de cualquier nivel
     * recibe la empresa como tal y el id de la persona que está creando la empresa (Seria quien está en sesión)*/
    public void crearEmpresa(Empresa empresa, Integer id) throws Exception {

        EntityManager em = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
        try {
        	
        	em.getTransaction().begin();
            
        	ServiceFactory.getInstance().getEmpresaService().crearEmpresa(empresa, id, em);
        	
            em.getTransaction().commit();
        } catch (Exception e) {
        	if(em != null) {
        		em.getTransaction().rollback();
        	}
            throw e;
        } finally {
        	if(em != null) {
                    em.clear();
                    em.close();
		}
        }

    }
    
    
     public Empresa buscarEmpresaPorId(Integer id) throws Exception {

        EntityManager em = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
        Empresa empresa = null;
        try {
        	
            
        	empresa = ServiceFactory.getInstance().getEmpresaService().buscarEmpresaPorId(id, em);

        } catch (Exception e) {
            throw e;
        } finally {
        	if(em != null) {
                    em.clear();
                    em.close();
		}
        }
        return empresa;

    }
    
 
    public List<Empresa> obtenerEmpresasPorTipo(Integer id) throws Exception {

        List<Empresa> empresasDependientes = new ArrayList<Empresa>();
        EntityManager em = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
        try {
        	
        	empresasDependientes = ServiceFactory.getInstance().getEmpresaService().obtenerEmpresas(id, em);
            
        } catch (Exception e) {
            throw e;
        } finally {
        	if(em != null) {
                    em.clear();
                    em.close();
		}
        }
        return empresasDependientes;
    }
     
    
    //Retorna la ista de empresas dependuentes dado el id de la empresa
     public List<Empresa> obtenerEmpresasDependientes(Integer id) throws Exception {

        List<Empresa> empresasDependientes = new ArrayList<Empresa>();
        EntityManager em = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
        try {
        	
        	empresasDependientes = ServiceFactory.getInstance().getEmpresaService().obtenerEmpresasDependientes(id, em);
            
        } catch (Exception e) {
            throw e;
        } finally {
        	if(em != null) {
                    em.clear();
                    em.close();
		}
        }
        return empresasDependientes;

    }
     
     
     public void actualizarEmpresa(Empresa empresa, int id) throws CantCreateUpdate,  NotEntityFoundException{
         EntityManager em = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
        try {
        	em.getTransaction().begin();
        	ServiceFactory.getInstance().getEmpresaService().actualizarEmpresa(empresa, id, em);
                em.getTransaction().commit();
        } catch (CantCreateUpdate e) {
        	if(em != null) {
        		em.getTransaction().rollback();
                }
                throw e;
        } catch (NotEntityFoundException e) {
        	if(em != null) {
        		em.getTransaction().rollback();
                }
                throw e;
        } finally {
        	if(em != null) {
                    em.clear();
                    em.close();
		}
        }
     }
     
     
     public void eliminarEmpresa(Integer idEmpresa, Integer idPersona) throws Exception {
         EntityManager em = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
         try {
        	em.getTransaction().begin();
        	ServiceFactory.getInstance().getEmpresaService().eliminarEmpresa(idEmpresa, idPersona, em);
                em.getTransaction().commit();
        } catch (Exception e) {
        	if(em != null) {
        		em.getTransaction().rollback();
        	}
                throw e;
        } finally {
        	if(em != null) {
                    em.clear();
                    em.close();
		}
        }
     }
     
     
     public int obtenerUltimaEmpresaCreada() throws Exception {
        EntityManager em = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
        int id;
        try {
        	id = ServiceFactory.getInstance().getEmpresaService().ultimaEmpresaCreada(em);
        } catch (Exception e) {
        	
            throw e;
        } finally {
        	if(em != null) {
                    em.clear();
                    em.close();
		}
        }
        return id;

     }

    public Empresa obtenerEmpresaPorNit(String nit) throws Exception {
        EntityManager em = Persistence.createEntityManagerFactory("bienestarPU").createEntityManager();
        Empresa empresa = null;
        try {
        	empresa = ServiceFactory.getInstance().getEmpresaService().obtenerEmpresaPorNit(nit, em);
        } catch (Exception e) {
            throw e;
        } finally {
        	if(em != null) {
                    em.clear();
                    em.close();
		}
        }
        return empresa;
    }
}
